#include <string.h>
#include "iconbrowserapp.h"
#include "iconbrowserwin.h"
+#include "iconstore.h"
#include <gtk/gtk.h>
typedef struct
GtkApplicationWindowClass parent_class;
};
-enum {
- NAME_COLUMN,
- SYMBOLIC_NAME_COLUMN,
- DESCRIPTION_COLUMN,
- CONTEXT_COLUMN
-};
-
G_DEFINE_TYPE(IconBrowserWindow, icon_browser_window, GTK_TYPE_APPLICATION_WINDOW);
static void
gtk_tree_model_get_iter (GTK_TREE_MODEL (win->filter_model), &iter, path);
if (win->symbolic)
- column = SYMBOLIC_NAME_COLUMN;
+ column = ICON_STORE_SYMBOLIC_NAME_COLUMN;
else
- column = NAME_COLUMN;
+ column = ICON_STORE_NAME_COLUMN;
gtk_tree_model_get (GTK_TREE_MODEL (win->filter_model), &iter,
column, &name,
- DESCRIPTION_COLUMN, &description,
+ ICON_STORE_DESCRIPTION_COLUMN, &description,
-1);
if (name == NULL || !gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), name))
symbolic_name = NULL;
}
gtk_list_store_insert_with_values (win->store, NULL, -1,
- NAME_COLUMN, regular_name,
- SYMBOLIC_NAME_COLUMN, symbolic_name,
- DESCRIPTION_COLUMN, description,
- CONTEXT_COLUMN, context,
+ ICON_STORE_NAME_COLUMN, regular_name,
+ ICON_STORE_SYMBOLIC_NAME_COLUMN, symbolic_name,
+ ICON_STORE_DESCRIPTION_COLUMN, description,
+ ICON_STORE_CONTEXT_COLUMN, context,
-1);
}
search_text = gtk_entry_get_text (GTK_ENTRY (win->searchentry));
if (win->symbolic)
- column = SYMBOLIC_NAME_COLUMN;
+ column = ICON_STORE_SYMBOLIC_NAME_COLUMN;
else
- column = NAME_COLUMN;
+ column = ICON_STORE_NAME_COLUMN;
gtk_tree_model_get (model, iter,
column, &name,
- CONTEXT_COLUMN, &context,
+ ICON_STORE_CONTEXT_COLUMN, &context,
-1);
if (!name)
visible = FALSE;
win->symbolic = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle));
if (win->symbolic)
- column = SYMBOLIC_NAME_COLUMN;
+ column = ICON_STORE_SYMBOLIC_NAME_COLUMN;
else
- column = NAME_COLUMN;
+ column = ICON_STORE_NAME_COLUMN;
+
+ icon_store_set_text_column (ICON_STORE (win->store), column);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (win->list), win->cell, "icon-name", column, NULL);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (win->list), win->text_cell, "text", column, NULL);
static void
icon_browser_window_init (IconBrowserWindow *win)
{
+ GtkTargetList *list;
+ GtkTargetEntry *targets;
+ gint n_targets;
+
gtk_widget_init_template (GTK_WIDGET (win));
+ list = gtk_target_list_new (NULL, 0);
+ gtk_target_list_add_text_targets (list, 0);
+ targets = gtk_target_table_new_from_list (list, &n_targets);
+ gtk_target_list_unref (list);
+
+ gtk_icon_view_enable_model_drag_source (GTK_ICON_VIEW (win->list),
+ GDK_BUTTON1_MASK,
+ targets, n_targets,
+ GDK_ACTION_COPY);
+
+ gtk_target_table_free (targets, n_targets);
+
win->contexts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
gtk_tree_model_filter_set_visible_func (win->filter_model, icon_visible_func, win, NULL);
static void
icon_browser_window_class_init (IconBrowserWindowClass *class)
{
+ g_type_ensure (ICON_STORE_TYPE);
+
gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
"/org/gtk/iconbrowser/window.ui");
--- /dev/null
+#include "iconstore.h"
+#include <gtk/gtk.h>
+
+struct _IconStore
+{
+ GtkListStore parent;
+
+ gint text_column;
+};
+
+struct _IconStoreClass
+{
+ GtkListStoreClass parent_class;
+};
+
+static void icon_store_drag_source_init (GtkTreeDragSourceIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (IconStore, icon_store, GTK_TYPE_LIST_STORE,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
+ icon_store_drag_source_init))
+
+
+static void
+icon_store_init (IconStore *store)
+{
+ GType types[4] = { G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING };
+
+ gtk_list_store_set_column_types (GTK_LIST_STORE (store), 4, types);
+
+ store->text_column = ICON_STORE_NAME_COLUMN;
+}
+
+static void
+icon_store_class_init (IconStoreClass *class)
+{
+}
+
+static gboolean
+row_draggable (GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ return TRUE;
+}
+
+static gboolean
+drag_data_delete (GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter (GTK_TREE_MODEL (drag_source), &iter, path))
+ return gtk_list_store_remove (GTK_LIST_STORE (drag_source), &iter);
+ return FALSE;
+}
+
+static gboolean
+drag_data_get (GtkTreeDragSource *drag_source,
+ GtkTreePath *path,
+ GtkSelectionData *selection)
+{
+ GtkTreeIter iter;
+ gchar *text;
+
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (drag_source), &iter, path))
+ return FALSE;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (drag_source), &iter,
+ ICON_STORE (drag_source)->text_column, &text,
+ -1);
+
+ gtk_selection_data_set_text (selection, text, -1);
+
+ g_free (text);
+
+ return TRUE;
+}
+
+
+static void
+icon_store_drag_source_init (GtkTreeDragSourceIface *iface)
+{
+ iface->row_draggable = row_draggable;
+ iface->drag_data_delete = drag_data_delete;
+ iface->drag_data_get = drag_data_get;
+}
+
+void
+icon_store_set_text_column (IconStore *store, gint text_column)
+{
+ store->text_column = text_column;
+}